package com.powernode.customer.controller;


import com.powernode.common.result.Result;
import com.powernode.customer.service.CustomerInfoService;
import com.powernode.model.entity.customer.CustomerInfo;
import com.powernode.model.form.customer.UpdateWxPhoneForm;
import com.powernode.model.vo.customer.CustomerLoginVo;
import io.swagger.v3.oas.annotations.Operation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

/**
 * 客户信息控制器
 * 处理客户信息相关的HTTP请求
 */
@Slf4j
@RestController
@RequestMapping("/customer/info")
@SuppressWarnings({"unchecked", "rawtypes"})
public class CustomerInfoController {
	// 客户信息服务，用于处理业务逻辑
	@Autowired
	private CustomerInfoService customerInfoService;

	/**
	 * 获取客户基本信息接口
	 * 该接口用于根据客户ID查询客户的基本信息
	 *
	 * @param customerId 客户ID，通过路径变量传递，不能为null
	 * @return Result<CustomerInfo> 统一响应结果，包含客户信息实体对象
	 */
	@Operation(summary = "获取客户基本信息")
	@GetMapping("/getCustomerInfo/{customerId}")
	public Result<CustomerInfo> getCustomerInfo(@PathVariable Long customerId) {
		// 调用服务层方法获取客户信息并返回结果
		return Result.ok(customerInfoService.getById(customerId));
	}

	/**
	 * 小程序授权登录接口
	 * 该接口用于处理微信小程序的授权登录流程，通过code获取用户唯一标识（客户ID）
	 *
	 * @param code 微信小程序登录凭证code，通过路径变量传递，不能为null
	 * @return Result<Long> 统一响应结果，包含客户ID，状态码为200表示成功
	 */
	@Operation(summary = "小程序授权登录")
	@GetMapping("/login/{code}")
	public Result<Long> login(@PathVariable String code) {
		// 调用服务层登录方法处理微信小程序登录
		return Result.ok(customerInfoService.login(code));
	}

	/**
	 * 获取登录用户详细信息接口
	 * 该接口用于获取已登录用户的完整信息，包括基本信息和手机绑定状态
	 *
	 * @param customerId 客户ID，通过路径变量传递，不能为null
	 * @return Result<CustomerLoginVo> 统一响应结果，包含客户登录视图对象
	 */
	@Operation(summary = "获取登录用户信息")
	@GetMapping("/getCustomerLoginInfo/{customerId}")
	public Result<CustomerLoginVo> getCustomerLoginInfo(@PathVariable Long customerId) {
		// 调用服务层方法获取客户登录信息并返回结果
		return Result.ok(customerInfoService.getCustomerInfo(customerId));
	}

	/**
	 * 更新微信手机号接口
	 * 该接口用于处理微信小程序用户更新手机号的请求
	 *
	 * @param updateWxPhoneForm 更新手机号表单对象，通过请求体传递，包含以下字段：
	 *                         - code: 微信小程序获取手机号的临时凭证
	 *                         - encryptedData: 加密的用户数据
	 *                         - iv: 加密算法的初始向量
	 *                         - customerId: 客户ID，用于标识要更新手机号的用户
	 * @return Result<Boolean> 统一响应结果，布尔值表示更新操作是否成功
	 */
	@Operation(summary = "更新手机号")
	@PostMapping("/updateWxPhoneNumber")
	public Result<Boolean> updateWxPhoneNumber(@RequestBody UpdateWxPhoneForm updateWxPhoneForm) {
		// 调用客户信息服务层的updatePhone方法处理手机号更新逻辑
		// 该方法会解密微信加密数据，提取手机号，并更新到数据库
		return Result.ok(customerInfoService.updatePhone(updateWxPhoneForm));
	}

}

